/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package serversocket;
import java.util.ArrayList;
import java.util.List;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Calendar;
import java.util.logging.Level;
import java.util.logging.Logger;
import serversocket.*;

/**
 *
 * @author Antonio
 */
public class Servidor 
{

    /**
     * Puerto de Salida del servidor central, dinamico su valor depende
     * del hilo que se ejecute
     */
    private int portSalida;
    /**
     * Puerto de Escucha en el servidor central, dinamico, solo cambiara en
     * circunstancias determinadas (puerto ocupado por otra aplicacion)
     */
    private int portEscucha;
    /**
     * Lista de sucursales, su funcion es llevar las estadisticas de los envios
     */


    /**
     * Longitud de la cola de peticiones que puede manejar el servidor
     */

    private static final int longCola = 5;

    /**
     * Constructor de la clase
     * Al levantar el nodo centrar debe haberse definido su puerto de escucha     *
     * @param portEscucha
     */

    public Servidor(int portEscucha) {
        this.portEscucha = portEscucha;

    }


    public int getPortEscucha() {
        return portEscucha;
    }

    public void setPortEscucha(int portEscucha) {
        this.portEscucha = portEscucha;
    }

    public int getPortSalida() {
        return portSalida;
    }

    public void setPortSalida(int portSalida) {
        this.portSalida = portSalida;
    }



   
    /*** Metodos para el manejo mensajes entre los nodos ***/

    /**
     * Metodo destinado a escuchar cualquier tipo de mensaje referenciado
     * al nodo central
     */
//    public void escuchar() throws ClassNotFoundException
//    {
//        try
//        {
//            ServerSocket servidor = new ServerSocket(this.portEscucha,longCola);
//            Socket conexion = servidor.accept();
//            ObjectInputStream entrada = new ObjectInputStream(conexion.getInputStream());
//            Sucursal miSucursal = (Sucursal)entrada.readObject();
//        }
//        catch (IOException ex) {
//                System.out.println("Error en el proceso de Escuchar del Servidor");
//        }
//
//       // ObjectOutputStream entrada = new ObjectOutputtStream(conexion.getInputStream());
//
//
//    }
    
    public void enviarMensaje(Object mensaje){
    try {
        // TODO code application logic here
        String ip = "192.168.1.102";
        Socket nodoSiguiente = new Socket(ip, 9001); //Puerto por donde enviara el msj
        //PrintWriter salida = new PrintWriter(nodoSiguiente.getOutputStream(), true);
        ObjectOutputStream salida = new ObjectOutputStream(nodoSiguiente.getOutputStream());
        salida.writeObject(mensaje);
        salida.close();
        nodoSiguiente.close();
    } catch (IOException ex) {
        System.out.println("Problema al enviar msj");
        ex.printStackTrace();
        }
    }   

    public void esperarMensaje() {


        try {
            
            ServerSocket servicio = new ServerSocket(this.portEscucha); //Puerto de escucha, donde llegan las peticiones
            Socket socketServicio = null;
            System.out.println("Soy Server esperando...  ");
            //System.out.println("Puerto Escucha "+this.portEscucha+" Salida"+this.portSalida);
            //esperamos conexion
            boolean prueba = true;
            
            while(prueba) 
            {
                socketServicio = servicio.accept();
                PrintWriter salida = new PrintWriter(socketServicio.getOutputStream(), true);
                BufferedReader entrada = new BufferedReader(new InputStreamReader(socketServicio.getInputStream()));
                String mensaje =  entrada.readLine();
                /**
                 * Se instancia una operacion cargada con el 
                 * mensaje que acaba de recibir de un nodo del anilo
                 */
                Operacion operacion = new Operacion(mensaje);
                /**
                 * Se procede a ejecutar un hilo de procesara 
                 * los datos del mensaje recibido
                 */
                operacion.start();

                salida.close();
                entrada.close();
                socketServicio.close();
            }
            servicio.close();
        }catch (IOException ex) {
                System.out.println("Algo se daño:");
                ex.printStackTrace();
       }      
    }
}
